package org.wmq.positiontoshop.exception;

import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.ElasticsearchStatusException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.wmq.positiontoshop.common.Result;

/**
 * Elasticsearch异常处理器
 * 专门处理Elasticsearch相关的异常
 */
@ControllerAdvice
@Slf4j
public class ElasticsearchExceptionHandler {
    
    /**
     * 处理ElasticsearchStatusException异常
     * 
     * @param e ElasticsearchStatusException异常
     * @return 错误响应
     */
    @ExceptionHandler(ElasticsearchStatusException.class)
    public ResponseEntity<Result<Void>> handleElasticsearchStatusException(ElasticsearchStatusException e) {
        log.error("Elasticsearch状态异常: {}", e.getMessage(), e);
        
        String message = "搜索服务暂时不可用，请稍后再试";
        
        // 根据不同的错误状态码返回不同的错误信息
        if (e.status().getStatus() == 404) {
            message = "未找到相关资源";
        } else if (e.status().getStatus() == 400) {
            message = "搜索请求参数错误";
        } else if (e.status().getStatus() == 503) {
            message = "搜索服务暂时不可用";
        }
        
        return new ResponseEntity<>(Result.error(message), HttpStatus.INTERNAL_SERVER_ERROR);
    }
    
    /**
     * 处理所有其他Elasticsearch相关异常
     * 
     * @param e 异常
     * @return 错误响应
     */
    @ExceptionHandler({org.springframework.data.elasticsearch.UncategorizedElasticsearchException.class, 
                       org.elasticsearch.client.ResponseException.class})
    public ResponseEntity<Result<Void>> handleOtherElasticsearchExceptions(Exception e) {
        log.error("Elasticsearch其他异常: {}", e.getMessage(), e);
        return new ResponseEntity<>(Result.error("搜索服务出现异常，请稍后再试"), HttpStatus.INTERNAL_SERVER_ERROR);
    }
    
    /**
     * 处理数据同步异常
     * 
     * @param e RuntimeException异常（数据同步相关）
     * @return 错误响应
     */
    @ExceptionHandler(value = {
            RuntimeException.class
    })
    public ResponseEntity<Result<Void>> handleDataSyncException(RuntimeException e) {
        if (e.getMessage() != null && (e.getMessage().contains("同步店铺数据到Elasticsearch失败") || 
                                       e.getMessage().contains("从Elasticsearch删除店铺数据失败"))) {
            log.error("店铺数据同步异常: {}", e.getMessage(), e);
            return new ResponseEntity<>(Result.error("店铺数据同步失败，请稍后再试"), HttpStatus.INTERNAL_SERVER_ERROR);
        }
        // 如果不是数据同步相关的异常，返回null让其他异常处理器处理
        return null;
    }
}